{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Ridge Regression\n",
    "#### 目标 : 使 $J(\\theta) = MSE(y, \\hat y ; \\theta) + \\alpha \\frac{1}{2} \\sum_{i=1}^{n}\\theta_{i}^2$尽可能小\n",
    "## LASSO Regression \n",
    "Least Absolute Shrinkage and Selection Operator Regression\n",
    "\n",
    "LASSO趋向于使得一部分$\\theta 值变为0, 所以可以作为特征选择用$\n",
    "#### 目标 : 使 $J(\\theta) = MSE(y, \\hat y ; \\theta) + \\alpha \\sum_{i=1}^{n} |\\theta_{i} |$ 尽可能小"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "np.random.seed(42)\n",
    "x = np.random.uniform(-3.0, 3.0, size=100)\n",
    "X = x.reshape(-1, 1)\n",
    "y = 0.5 * x + 3 + np.random.normal(0, 1, size=100)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x16e42973208>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.scatter(x, y)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.model_selection import train_test_split\n",
    "\n",
    "np.random.seed(666)\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.pipeline import Pipeline\n",
    "from sklearn.preprocessing import PolynomialFeatures\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "from sklearn.linear_model import LinearRegression\n",
    "\n",
    "def PolynomialRegression(degree):\n",
    "    return Pipeline([\n",
    "        ('poly', PolynomialFeatures(degree=degree)),\n",
    "        ('std_scaler', StandardScaler()),\n",
    "        ('lin_reg', LinearRegression())\n",
    "    ])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "167.9401086144252"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.metrics import mean_squared_error\n",
    "\n",
    "poly10_reg = PolynomialRegression(degree=20)\n",
    "poly10_reg.fit(X_train, y_train)\n",
    "\n",
    "y10_predict = poly10_reg.predict(X_test)\n",
    "mean_squared_error(y_test, y10_predict)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "def plot_model(model):\n",
    "    '''封装一个画模型的函数'''\n",
    "    X_plot = np.linspace(-3,3,100).reshape(100,1)\n",
    "    y_plot = model.predict(X_plot)\n",
    "\n",
    "    plt.scatter(x, y)\n",
    "    plt.plot(X_plot[:, 0], y_plot, color='r')\n",
    "    plt.axis([-3,3,0,6])\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAW4AAAD8CAYAAABXe05zAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAAIABJREFUeJztnXd4FOX2x78nBYi0UEJJqCIS6SWREmyAAoqIhauIXm/xcpGrYgGBa0VFEAtcbIjKvQqKFVFBRRFEQYpAUPoPkBqU0EJLICF5f3+cbJLdnd2dnZ3Zndk9n+fJk2R3ZufdZOfMme/7PeclpRQEQRAE5xAX6QEIgiAIwSGBWxAEwWFI4BYEQXAYErgFQRAchgRuQRAEhyGBWxAEwWHoCtxElExEHxPRViLaQkTdrR6YIAiCoE2Czu3+A+BrpdRNRFQJwHkWjkkQBEHwAwUqwCGiGgB+AXC+kmodQRCEiKMn4z4fwCEA/yWiDgDWAhiplDpdcSMiGgZgGABUrVq1S3p6utljFQRB8ElefhFy8gpQUiG/jCNCWnISks9LjODI9LF27drDSqkUPdvqybgzAKwEkKWUWkVE/wFwQin1qK99MjIy1Jo1a4IZsyAIQkhkTVqMnLwCr8fTkpOwfGyvCIwoOIhorVIqQ8+2eiYn9wPYr5RaVfr7xwA6Gx2cIAiCFRzQCNr+HncyAQO3UuoPAPuIqFXpQ70BbLZ0VIIgCEGSmpwU1ONORq+P+x4A7xLRrwA6AnjGuiEJgiAEz+i+rZCUGO/2WFJiPEb3beVjD+eiyw6olFoPQJf2IgiCEAkGdUoDADy3cBsO5BUgNTkJo/u2Kns8mtDr4xYEQbA9gzqlRWWg9kRK3gVBEByGBG5BEASHIYFbEATBYUjgFgRBcBgSuAVBEByGBG5BEASHIYFbEATBYYiPWxBinHnZOTFRtBJNSOAWhBhmXnYOxs3dgIKiYgBATl4Bxs3dAAASvG2MSCWCEMM8t3BbWdB2UVBUjOcWbovQiAQ9SOAWhBgmllqhRhMSuAUhhomlVqjRhARuQYhhYqkVajQhk5OCEMPEUivUaEICtyDEOLHSCjWaEKlEEATBYUjgFgRBcBgSuAVBEByGaNyCIAhhxIwWAxK4BSECSH+Q2MRfi4FgkMAtCGFG+oPELma1GBCNWxDCjPQHiVGUQp/vPkT1s6e9ngq2xYBk3IIQZqQ/SOSIqES1bRvGL3odBQmV8WGHq9yeSk1Owu4gXkoybkEIM9IfxESOHQNKSnRt6pKocvIKoFAuUc3LzrF2jC6OHgUApJ7Jc3vYSIsBCdyCEGakP4hJrFwJNGgANG8OPPwwsHWr380jLlHlccC+tkE80pKTQADSkpMw8YZ24ioRBLsj/UFM4ORJ4LbbgPr1gdatgUmTgGeeAf76V2DmTM1dIi5RlQbuFiofy8f2CumldAVuItoN4CSAYgDnlFIZIR1VEGIc6Q8SIvfdB/z2G7B0KXDJJcDvvwNPPglMnw7cfjtwxRVeu6QmJyFHI0iHTaI6doy/HzwY8ksFI5VcoZTqKEFbEISIMncuZ9Vjx3LQBoCGDYEXXwQaNwZGjdLUvQNJVPOyc5A1aTGaj12ArEmLzde+SzPucAduQRCEyHLgAPCPfwBdugBPPOH+XFISyyXr1gHvvee166BOaZh4QztNfTksE5euwJ2bG/JLkVIq8EZEuwAcA6AAvK6UmuFv+4yMDLVmzZqQBycIguDG/fcDr74K/Por0EpjMrekBMjMBA4f5snKJH0ySNakxZoySlpyUsh6dBl33gm89Rb/XFgIJCa6PU1Ea/UqGnoz7iylVGcA/QH8i4gu9dyAiIYR0RoiWnPo0CGdLysIgqCTkhLgo4+A/v21gzYAxMUBzz8P7N0LTJum+6XDMnGZV8EGGGKM1BW4lVIHSr/nAvgUwMUa28xQSmUopTJSUlJCGpQgCIIXK1cCOTnA4MH+t7viCuDaa1k2KfVOByIs3vqKgTtEuSRg4CaiqkRU3fUzgKsAbAzpqIIg2B7LJ+uC5aOPgMqVOSgH4umngRMnfFoDPQmLt/7YMaBmTf45xAlKPRl3fQDLiOgXAKsBLFBKfR3SUQVBsDURrzL0pKQE+PhjoG9foEaNwNu3b8+Ok+nTdVVW+pu4NI28vHKJJ8SMO6CPWyn1G4AOIR1FEARH4a/KMJz+c1dvkfqb1mHu/v1YO2wUuujdecQIYMgQ4NtvOeAHwHJvfV4ekJUFrF4dloxbEIQYI+JVhnDP+q/eugxn4xMw/EQj/Vn/DTcA9eqxCyXSKMWBu0kToEoVCdyCIJiPHRphubJ+UiXov+0n/NisEw7FV9HfW6RSJfZ8z58P7Nlj7WA1qDhHcOX4+SzZ1KrFFxOrJycFQYg97NAIy5Xddzzwf0g7eQhfpvd0e1wXw4bx9xl+S09Mx3OO4HTuYQBA9gnF/VUk4xYEwWzCMlkXAFd2f/W2ZSiMS8CiC7q6Pa6LJk3YhfLmm8DZs1YMUxPPOYIaZ3jxhI93njIlcEt3QEEQNIl0I6zRfVth3NwNuGr7Sixr1hEnqlQzlvWPGAF89hnwySfArbdaM1gPPO8Kap45BQDYVVyJpZJ160J6fcm4BUGwJYM6pWFqt1pomvcHfmze2XjW36cPkJ7OBTnFxYG3d3H8OPD228Dnn3OgPXxY966edwU1Spcrq1y3Nmfcubm6F4DQQgK3IAi2pe8Rnoh8/MV/YfnYXsbuAOLiuCHVpk3Ahx/q26e4GLj+euAvfwGuu46bWqWkAP/9r67dPecIXFLJkKvac+A+d668zasBJHALgmBfli4FatcG2rYN7XUGDwbatQMef5yDZiCeegpYsgR4+WX2Xc+dCzRrBrz/vq7Dec4RNCHW16/KSmepBAjJWSKBWxAE+/L998Cll3LWHApxcbzQwvbtwOzZ/rddvJi3/fOfWR/PzOTs+8YbeTwnT+o65KBOaVg+thd2TboGIzNK+zfVrMkZNxDSBKUEbkEQ7Mm+fbzKzeWXm/N6Lslj/Hhuq6rFwYPA0KFcmv7KKwBR+XMDBvB+ixYFf+y8PC7Vj4+XwC0IQhSzdCl/v+wyc16PiCWQ3bu1m08dO8ZZdV4ea+HVqrk/n5XFGfOCBcEfOy8PSE7mn0UqEQQhavn+e640bN/evNfs1w/o0QMYN46Dt8vZsXMn0L0769nvvMN6uCeJidzzZMGC4B0hx47xewGAOnVYupGMWxCswXatTWMJs/TtihBxYG7TBvj737mD4KxZQLduvLjBokX++30PGAD88UfwPuyKGXdcHDtUJHALgvnYrrVpLLF/P2fBZskkFWnRAvjhB7b2bd/Ok5C1avFCDZd6Le7lTv/+UER4a+xLwV3MKwZuoNzLbRAJ3ILgA3+tTQWLcenbZk1MehIXxx7tbdt4EnLFCqBly4C7zdt3FtlpFyFz00/BXcwrSiVAyGXvErgFwQd2aG0asyxdyhmqmfq2FrVqseWvTh1dmz+3cBsWnZ+B9n/sQMopXhZN18XcM+OuV08CtyBYgR1am8Ys33/P+nN8fMBNrUJrfuNAXgEWt8gEAFyxc03Ztn4v5ufOsfdbpBJBsB47tDaNSQ4cYO3ZKplEB77mN2omJWJrSjPkVE9Bn52ry7b3ezE/fpy/e0ol+fnAqVOGxieBWxB8YIfWpjHJjz/y90AThRbia36DCEiqlIAVTduj4wGWRwgc2H1OVLpWd/eUSgDDcklUtXV1rU93IK8AqclJGN23leUnWSSOKYSPSLc2jTXmZefg3H/eR//EKui/8BgeiM+JyN/fl/SRl1+EKTd3RM6a81Fv43eoceYUTlThQh1XVg7AfcxagdtVPZmbyy6XIImajDsS1i2xiwmCebjOp4t2/op1qenYe7IwYueTv/mNQZ3S8K8R1wIAzj/qPjbNiUpXF0BPqQQwnHFHTeCOhHVL7GKCYB7PLdyGhFMncFHuLqxp1BpA5M6ngPMb6ekAgBZH9nvt65Wt+5NKDE5QRo1UEgnrltjFBME8DuQV4NKcrYiDws+lgdv1eLhxSR0+ZdDmzVEUn4ALjuzz2tcrWxeN2zepyUnI0fgHW2ndisQxBSFaSU1OQsb+zThHcchOTXd7PBL4nd9ISEBB0/PR8pi7VKLpOnIF7opSSaVK/HusSyWRsG6JXUwQzGN031bomrMZGxu0QEGlKgDsfT7V6NgWXQtzA7uOjh1jP3rVqu6P16snUknAW5soOaYgRAuejqyHejVHl4P/h48yBoAA+59PF12E6p9/juUPXsKdA33hqpqs2Nsb4GrNI0cMHTpqAjcQGeuW2MUEIXhcDhLX5H5OXgHmvDYP1509i1seuBW33HBNhEeog/R04Nw5LPp8OR7fXuI7ecvLc5dJXCQkGF4wOKoCtxAc4kEX/GHl50PLkdVu90b+ISvLlGNYTqmz5LP3v0NOi24AfHi5jx1zn5h0QWQ4cOvWuIkonoiyiWi+oSMJtkI86II/rP58aDlFMnM2Y1et1HKPs91pxdp749y9bg97WRg9G0y5IAKUMnToYCYnRwLYYugogu0QD7rgD6s/H15OEaWQsX8zNp1vcTdAM6leHb9Xq4MWRwN4uSMVuImoEYBrALxp6CiC7RAPuuAPqz8fno6sFkf3o3bBCaRe08eU1w8X+xs01SzCcbswefbidhEXZ7lUMhXAQwB8HoWIhhHRGiJac+jQIUODEcKHtCwV/GH158OzgdeVR7cDADoPvdaU1w8Xdbq05yKcCpmzl4UxEhk3EQ0AkKuUWutvO6XUDKVUhlIqIyUlxdBghPAhHnTBH+H4fAzqlIblY3thys0d0WHXBhw+ryayPtnnqHmW8y/JQLXCAnSIz9f2cp85w18mB249rpIsAAOJ6GoAVQDUIKLZSqnbDB1RsAXiQRf8uUbC9fmYl52DcZ/8iiXb12JFk/bIOX5Gu8OeXXE5S/rUBXr18n5eq2rSRVycdYFbKTUOwDgAIKLLAYySoO1MtE7U5WM1PmxCRAinPVPLR+0ZMMNRo/Dcwm1I/WMPGpw6imXNOgIonwR1UuDG1q3+A3ek7ICCsxH7n70J9//HLq6iA3kF6LlnPQBgeWngdj3uCFJTgerVgS0+DHeBAncY7IBQSn2vlBpg6EhCRLHLiSpoE+7/j17XiNa6i2aSmpyEnruzsTu5IfbXrO/2uCMg4qx761bt5y2SSiTjjhHE/mdvwv3/0eMaCcddwEO9zkf3vRuwvFmHssccN0nuL3C7FlEQqUQwgtj/QiMcmWcwj4eKHtdIOO4Crjt3ANUKC7C5TVfnruuZng7s388ruXtikVQivUpihNF9W7lNRgEOzGwihJ6JvFAJ9/9Hj2skLHcBixYBRJgw7V5MqF3bvNcNgKkTwa4Jyi1bgIsvdn9OArcQCmL/M46/zNOsv1+k2hL7e/2wLBSyaBHQpQsQ5qBt6oW4Uyf+vm6dd+Detw+oUQOoUsV7vxAqJyVwxxDSgtYYVmWedrdnWn4XcPIksGIFMGqUOa+nE9MvxM2acW/tn38Ghg93f27VKiAjQ3u/cLlKBCEWsUJ/doI907Ms3XT9+YcfgHPngD7h7U9i+oWYCMjM5MBdkYIC4Ndfga5dfe8nUokgWIMVmWc45Jeg2LYNePttYN484MILgcGDgWuvtfYubdEilhBM7r8dSL+2RALKyAC++QbIzwfOO48fy87mC5OnfOJC7ICCYB1WZJ62sWeuXg10784TbM8+CzRsyJnjbbfxmojDhwNFRdYce9EioGdPbf3XIHruZCzpw5KZyXp1dnb5Y6tW8Xd/Gbdo3IJgHWZnnmGZ+AvETz8B/fqx4+G554ChQzlwl5Sw9vzOO8DrrwN//AF88AFQubLmyxhyaOzYAWzcCNxxh6lvSc+djCUTwS4d++efy+8gVq0CGjfmv6kWIpUIgrOIuD1z2TKgf38OKkuWAGkVglZcHAefrCygfXvg7ruBgQOBTz8tlwFKMezQmDWLA9eQIaa+Lb13MqZLQKmp/LVmTfljq1b5zrYBkUoEwWlYPvHnjx9+4Ew7LQ34/nv3oO3Jv/4FzJzJskb//qzhVsBQkU5JCWfzffr4P3YpwRQ/RbTQrOIEZW4usHu3/8AtUokgOI+I2DP37gWuu45v4ZcsARo0CLzPX/8KJCUBt94K3HMP8NZbZU/pyXA9pZRJdY/ikt27gaefDnjoYDP6iN7JZGYCn33GRTerV/NjviYmAbEDCoKgg3PnWMcuLgbmz9cXtF3ccgvw8MOcfb/zTtnDgTJcrcnC3JffQNF5VYHrrw942GAz+ojeybh07nXrgFWrUBIfj97fn/R9pyAatyAIAZkwgbXtWbOAFi2C3/+JJ3j/u+7iINW6dcAM1zPwVik6g6u2/IiF7S7DAA+9XAsj7puIFZpVmKDMXfQDjtRtip2lypLmnUIY1pwUBMGBuPThwbdNRvH4J7Hv6hvY6meE+Hjgvfe4//TgwcDp0wEzXM8A2/f/VqB6YQFmX3iZrkM6qjlanTrA+ecDq1cjaf1aZDe40O1przsFybiFWCacK8c4CZdMkXjyOKZ88Tz21ayPm9rcikeyc4z/fRo2BN59F7jySvZ4v/OO3wzX0/Z448bF2FezPva39VEG7kHE3TfBkpEBfPEFqp8pQHbqhV5Pu13IROMWYhUnlI5HCpdM8eh3b6LBySMYee0oHI6rEnpb1t69WTaZPZt93n6oWOxS/+RhZO35BV+064VR/S/SdaiIatZGyMzkUncA6xt6X1zc7hSsXHNSEOyM7UrHbcSBvAL02rEagzcuwkvdb8Yvqa3KHg+ZRx4BVq4ERo7k7n6ZmZqbVSx2ufvrOSAotBw1AlcG8b9xVHO0Up276LyqONCgKVDho+l1pyB2QMEI0SAx2KZ0XAuluAjj1Clu7Vm9OtvwqlULy+FbVSrCxIUvY0tKM7zU45ayx03Rh+PieJKzc2fgppvYSVGnTtnTnp+tFyvtQtdfFgIPPYQrr+sZ+vHtSpcuABESu16MCTd19H9+icYtBEs4FgcIB7YoHdfi55+Bhx7iApeK1KwJjBnDmaoOV0UovLF2FmrnH8ffbnwMhQmJAEzWh+vUAT7+mPuN3HwzN6iqVs3rs1W0bz8u/O8DyEtvh+SnnjLn2HalenVgxAggKyvwnYJUTgrBEi2LB1vSMCgUcnO5jPvii4FNm4CXXgJ+/BFYsIAdGZddBvz730DLlsAbbxi+VQ7IvHlo/OVc7LzzXuSlt7NOH87MZJ17yRKgWzdg+3a3zxapErywYAqqFJ3FXVc/CFSqZN6x7crLL+sr5RepRAgWW0sMQWCrlX3y84FrrgE2bGANePRolkgqMmQIB/IxY4Bhw4CvvuKCFjPlk927gb/9DejUCekvTcJyq4PlX/4CNGrERTqZmWjT+x4k1UpFiyP7cdmutbhkz3qM63s3VibWtXYcTiMapZJo0F/tjG0lBgPYYvKquJj90WvXsmQwcKDvbS+5BFi+HJg2DXjgAaBHDy6Vbt489HGcPcse65IS4KOPwpfh9unDDZZuvBEz5rqXsn/ctjfmdOiLNAd+tiwl2lwl0aK/2hm7+WM9L9RXpKdgydZDzrlwjxnD3fOmTvUK2j6TkJEjgdatWR/OzGS9+PLLQxvHAw9wAP30U13VkaYmSM2a4fOXP8CaJ6fieEIV7KjTGLtqpyG/UhIS48i+3utIEW1SiVi8rMdOEoPWhXr2yr1lz9v+wv3668ALL3ADppEj3Z4KmIRceSU3JBo4kH+ePh34+9+NjeO994BXX+U1HAcNCri5FQnSs0v3IqdDf6/Hq1VJsOf/LpJEm1QSLfqrWVglG9lCYoD2hdoT21649+wB7r8f6NsXmDLF62ldScgFF/DCBX/6E3DnnbyM2MSJXGKul88/54DfsyfwzDO6drEiQfJ1jublW7SKjpOJtspJJ/UnCKZXsNHXj/bKQL0XZFteuB98kL/PmKEZaHUnITVrsvNkxAhejWbQIOD33/WN4Y03uNNeu3bA3LlAYqKu3axIkJx07kYcK+2ARFSFiFYT0S9EtImIxhs6UhDYzuLlg3AE1Wix7flD70lt5clv6AL87bfAJ59wu9MmTTQ3CSqQJSSwleyll/i109OBV17hiU8tlOLS82HDeGGEJUuAlJTA4zYyNp045dy1BSFo3Hoy7rMAeimlOgDoCKAfEXUzdDSdOKU/QTiCaizIRlonuydWnvyGLsCFhcC99/IEoCvr1iDoQEbES4Vt2MBe8Lvv5sV8//MfYOlS4Phx9oc//DB3ohs/nhc6mDcPqFo1qPdtRZB1yrlrC6zUuJVSCsCp0l8TS7+MHS0I7KK/+iMcQTWabHu+0JooDaerxJDWO20asHUrL0jgZ5Vyw5PALVsC33wDvP8+MHYscN997s/Hx7MF75ln2D9NFPB9mjY2Ha9r93PXFlhtBySieABrAVwA4BWl1CqNbYYBGAYATXzcNkYb4QiqdrPtWUUkT/agL8AHD3KmO2AAF9wEwPB7cy2mO2QIr7S+fj2Qnc1FPTfdBNSvH/xrmjU2P0gNhk4slkqglCpWSnUE0AjAxUTUVmObGUqpDKVURkoQOpuTCYeeJ7ee1hO01jt5MldJvvCChaPyoEED1rHHjeMFfE0I2lYQC5PpphEuO6BSKo+IvgfQD8BGQ0eMIsLlhbbLrWe0ZlJB3dUcPAi89hqv3Xihd6P8WEdqMILASqmEiFIAFJUG7SQAfQA8a+hoUYhdgqrVRHM1a1AX4Oef57LyRx4J8yidQSxMppuGxZWTDQG8XapzxwH4UCk139DRBMcS7ZmUrgtwbi5XJg4ZItm2D2JhMt00LHaV/Aqgk6FXF6IGyzKp/fuB777j/tWZmVxI4tlRzy688AIvSyXZtk9iZTLdFJxY8h6temm0Ynom9d57wFNPsaUOACpX5mKT4cO5b8d997F/OUwE/DwePszju+UWLowRNLFTDxzb47TugNGsl0YrpmVSJSWcsU6cyOvzvfAC+5HbtuVlvt59F/jgA+5uN2sWd86zGF2fxylT2Eny6KOWj8fpxMq8T8hYbQc0m1go4442fNkSAegvFT99mv3HEydymfZPP3Eb0vbtOfvo3p1Lvrdv59VUhgzh3y0m4OcxL4/HceONwEX6VicXhIA4TSqJ1MyzyDOh4ZlJBXXnVFAA9OrFvaKnTOH2p76q/ZKTgYULOXDfcw9PCo4fb6g6UA8BP4+vvgqcOMFLjgmCWcSV5s1KBf3ZjkjgblSjEmZMHYapWbdiYaseZY+bPfNcMVAnn5eIU2fOoaiEr3CG5BmluHfyzJm80OuTT/LioEGOJVouGrqdJkqxdr16NTdluuGGwC+elMQLC/zzn6yFN2rEWboF+NXv8/P5QtO/P9BJ5ugFE3EFawOBOyJSyZhLm+CiQ7vRbd+GssfMnnn2rOA6ll9UFrRd6JZnlALefBPo0IFv4WfP5l4VXbpwCXKQY4mWajLdd06vvcbrKj7xhL6g7SIhgVuW9u3LDZ3WrTM+WD/4rYB9802emJRsWzCbioE7SCISuAe05pL4lvmHLSvj1tOcH9Apz8yZA/zjH9zn+PXXuU/y4sWs2Xbrxvqnnz9+tGr6ukrFf/qJZZFrrjE2sRcXx5OUdevyWorHjxscrW98thVok8K9sS+5hBcoiACB2s1a3Q/eCHYcky2pKJUESWTsgIWFAICeiaexa1LgJj1G0KuXB5RnDhzg3hDdu/Pq3K5m+ZddBvzyC7fUvOceoFYtYOhQTUnEak0/UjJMQKfJwYM8Gdm0KQffOIN5QkoK8OGH/Df/619ZbjFZ79Z0QsycyT7zN94w9Vh6CTSHYEd3lh3HZFtcn2EDzpLIrIBTVLqM0e7dhmdVA6FHLw8ozyjFmfbZs8D//ue9wkndutwHuWtX4L778OXiDZqSSM0k7RVJzND0IynD+G2A5dK1jx7lVVlq1QrtYD16AM8+yzbBMDhNcO4cMGkS69p9+1p/PA0C3anZ8U7OjmOyLSFIJZHJuF2B+8QJtlqFelJroJUNJsYTqlZKwPGCIn2Z6X//C3z5JTex91XiHB/PGVnnzsDoUSi48l63pwuKilElMQ5JifGWVJNFuhTdp2d3zhy+qE2ezHY/M7j/fpaoxozhTnktW5rzulrMmsW2xLlzTc3ug7k7CnSnZse+IHYck22xe+D2/LCOvzAefVxP7t5tSeAOuYJr716u3rv8cl6FxB/t2gFjxuDqCROQ1fJSLG/W0e3pvPwiTLm5oyVyhp4TJexSyu+/89+sWzf2aZsFEa/t2KYNSyZLlwa3oK5ezp7lidTMTF2rpeslWBkhULWqHfuC2HFMkUDXOReCxm25VKJ1Kz9t4ebyDXbvtuzYgzqlYfnYXtg16RosH9sruGD1+ON8uzxzpj5t9pFHsLdOGp5Z+DKqFJ1xeyo1OSm0sfgh0ARh2KUUl0SSn893LGYH1tRUXpNx+XK+E7KCGTP4wv3MM6Zm28HKCIH6vdtxfUc7jinc6D7n7Kxxa31Yi88Wlv9iYeA2zN69bPm7806geXN9+1Spgr0Tp6Bp3h8YseKjsoet/tAGOlHCrjm++y7w+efAhAnW9fQYOhS47jq26Ll6nZjF6dPA008DV1wB9O7tczMjzolgZYRAi2jYcZENO44p3Og+5+wslWh9KCsVnyv/Zc8eq4cQPK6VTUaNCmq3nv8YjP2fXIc7l3yGd7pci8ppDS2XJTwloeTzEqEUcP8H6/Hcwm2at62ARZpjTg47bLp3914jUQe6JR0iYPp0lkzuuANYtoytmmYwbRpXas6b5zPbNuqcMCIjBOr7Yce+IHYcUzjRfYG2s1Si9aFMKKkQuM3IuAsKOGgUmBCMDh3iycahQwEDa2c2mjYZ550rxJrEtaZKIv5wyTBTbu6IM0UlyCsoKrtF83WjH4rmqJltKsWVjb4cODpeMyhJp0EDDt6rV3MFqxnk5fFk6rXX+u1MaPQuRmSE2ED3Unh2lkq0PqxVqfQKU716wMDt85Y0L48zripVuPy8USPg0kuB4sBFN36ZNg04c4adC0a48ELOAl99lT3AYUQroCjAK3iHEix8Bdh1T7zIDpxJkwwtMmAoGA4eDPzlL6zR+Y6MAAAUnklEQVRF//hj0Mf0YvRodjo99ZTfzYw6J0RGiA10X6DtLJVouTuGNW4MvAs+wXfs8Lmv31vSDd8BmzdzL4umTYEjR1jimDmTvddGOHGCPcKDBgEXXWTcjfHYY6yRT5jA5d5hwlfgUOAgYYarRCvA1jryO1rNfEyfA8cHhm1k06Zx0L7tNi6ISk42dHx89RWXt48Zw60N/BCKcyLWZYRYQLejze6Vk14f1i++4O8tWwJr13L2rHHC+fUor5zLWfZrr5W3R1y9miesbrrJmMVwxgwey7hxoVWANWvGF48ZM4CHHtI/wRkivgJKWnISlo/tZcoxPAMpqRI8++U0KKX0O3A0MBwMq1fnRRmystjNMmdO8E6QY8d4IrpNG+5CGABZ5UUIhK4LtJ2lEk1cBTgXXMDffcglvrKtY7nHuO3n9deXv3kizr6OHtV18nlRUMAZe+/eQGZm6G6Mhx/mJklGxmKQcGionoH0vmVzcMme9Xj5mrtCukCFNPaLL+a/8wcfsEYdLCNHcnn+22/zSjwBEMlDMAU7SyWauAK3Swvdswfo2NFrM19Z2PW5G1iH9uw017EjZ7ovv8zf27TRP6bp04E//uCeGDChAiw1lXucTJkCPPggF+lYzKAUhXr1DyH7y2WofWAP8ho0Rtub+uGSVuYVOFXMNvtu+wkjf5qDTzpchfRH7g/pdUMumBozBtiwARg7lrPwESMC7jIvOwerXnwLE2fPwsxet6N2XAPoLbcRyUMIGccF7tImU2Ulyz4ybl+3pMOP/sJ9QrQ6tj39NGdeI0cC336r77Y5P5/7YPTuzZ3gYFIF2L//zfLBqFF8h2AVGzey/e6779ADQA8AqF0b+GUhsPBN4K4EXsTgscdYUggBV7D6+O2v8eKCF7GpUToSp7+KgZ0bhfw2QgqG8fHcOvb0ab5gVqsG/PnPPjefl52DpU+/gkmfPY8N9VtgYucbkCDNkIRw4pIVHSeVNGwIVK3qM3Br3ZJOurYVGi9fzAvKJmhcd+rWZVfAd99xnwkdbHxkEnDwIAY3uKrMueLr1v2K9BT9hRe1a3Mr02++Ab7+WtdYguLoUZ4M7NCB5wqeeYbLwI8c4a9Dh3g+4cEHuW94z57cMGnFipAOO6hpEmbPn4iqtWuizcpFGNithUlvKEQSE/mOqXdvLol/9VV8tnq3pnUx59/jMWXuRPzSsCVuv/kpFMUnSjMkIbyEkHGTsqA7X0ZGhlqzZo3vDV5/nSeScnKAq67izPvTT/W9+Ndf82ok8+dzj2ctzp3jpk/HjwNbtrBd0Adf/LQdPa7MxOaU5rj9lqcBcIB2radY8db9ivQUfLI2x+0OgFDu2tC8tS8sBFq3Ztvi+vXaFxsjrFsHDBjA2uzw4azx1q3re/vTp3kid/JkDug338y9phs3Du64O3awz3nnTmDJkpAzeEs4dYov7EuWYE+thnip+82Y1/py1D91FO2P7cW4/E1o8sVHmJ9+CR685n6cTahUtisBlrUaFgQ3pk8H7rqLW0c3bAgiWquUytCza2QybpdUUqkSOzCCKcKZO5c1TD/lyEhIYJ17715emNYPe55+AXXyj2NKz6Flj1Xsrlexv8iSrYc0fdKAn4KRSpVYhtm0iXt3mMH8+exZT0zkNRxfecV/0Ab4zmbUKGDXLm6g9NlnQKtWfHeSn6/vuEuXcgvb3FyWoewYtAGWSb77Dg/9+SmcqHQenv9yKra8eCOWT/8bXvvgCTSa/zFmXXYL7hk42i1oA7HXDEmIIHaunNTEJZUkJrIHW2/gLi7mgHP11ZzB+uPSS7n6cfJk317x48dxy9L38UOzTljXyH31bq1JyEATkz5vtW+4gYPco48CJ0/6H3cgXn6Z+3SkpwMrVwa/DmLVqtxAa+tWvmN57DH+Hzz6KE/OanHoEP8dr7wSqFePbZeXXRba+7AaInzUsBOuvWMq7rzhUbzdeQAevmoEbhr6LDreOwfVpzyPKpXcy+TF0ieElRDsgJF1lSQmcsadl8eyRs2a/vf76SfO9vSuWzh5Mgf6++8v9467OHkS6N8fyWdO4flLb/faVSvz8jVhWRHN4E7EVsPu3dnt8M47wXuNlQLGjePsfeBA9i5XrRrca1SkaVPgo4+4z8fzz3Ox0OTJ3Oe6eXP2yFetyn+3b77hi+bVV/NxA/2fbILr/7WoZVcsatm17PG00m6NQAguFkEIFbu5Srb+cRLNxy7wfTJ4SiUAFn+9Go/uivd/En31Fcsg/fvrG0hqKmeXo0dzULrnHl49/NQpDkKrV2Pt5OnYntcI0FFMoeVy8Tqkr1vtrl1Zh37sMfYd33OPvvcAsGY/fDjw1ltcKfrKK+a1S+3Zk7927OA2qd9+yxO7p0/z802bchHRkCFhsTSaSaBCGbH0CRHFyspJImoM4B0ADQCUAJihlPLbCLmouMStjwXgYbFyZdzx8WWB++O5y5HTPBPwt9/atUDbtqxx6+Xee7mHxpgxnFnefTevorJiBTBnDroOHoyJOkvbK2ZprgZOFf/kAW+1H36YNekHHmDPean10C9nznDQnDeP5Yzx401fbxEAF0O99BL/rBSX/x85wv8fo2tFRhjJqgVbE4JUEtBVQkQNATRUSq0jouoA1gIYpJTa7Gufyg1bqoZ3TC373avketw4lg4KC1k/rVcPT/Qehv9lDHR7Hbf9lALq1cOerN64tduw4E5EpXhi7fnngQULOBDNns0BMQQM9TI5fpxXVjlxgi9EaX6237SJG1atXcvZ8L33Gj+uIAj24n//Y9vqb78BzZsH5SoJmHErpX4H8HvpzyeJaAuANAA+A7cnXrpvYSHLJABQty7yEyuj0fGDmvu5glTJ3n1Ycfgw3syvVaYz6+4fQsQNkC6/nO2Bx4/zslohYuhWu2ZNtj527coL4E6YANx6q3tWW1wMvPgi8MgjQI0avH3pElqyirYgRAkhaNxB3QMTUTMAnQCs0nhuGBGtIaI1xfnH3Z7z0n2Lisob3xPhYK0GaHQi1+t4NZMSy1qItjm4EwCwqZ57sUfQRRMXXWRK0A6JNm14wq9uXeD224EuXXhx2qlTWcPu2JF15Wuu4ay7wrqHsoq2IEQJIVRO6p6cJKJqAD4BcJ9S6oTn80qpGQBmACyVuB7X1H0rBm4ASS3PR5Ode902SUqMBxHKglSbgztRAsKWet6NjBy5gnSPHsDPPwPvv8/at6s8u3ZtvrjMns2ZuIeeLatoC0KUYLWrhIgSwUH7XaVUwDryxPg4EODfVVKpvPChQZd2qLtuFRrVqIycE2fL9rv/g/Vl27Q9uBO/1U5DQSVv/7Zjiybi4jg433gj95Ju1gxISfE7+eiEVbRFgxcEHVgZuImIALwFYItS6kU9L5reoDrWaJQNu07oB1ftQrf8YqzOzuETunVrJBTkY9nQlmw/K6XimoltDu7E6sbe3f4I0F00YduAUrkyWwR1YPde0KLBC4JOLK6czAJwO4BeRLS+9OvqYA9UccmrhJJinEFceYm4q/3qZvf5Tlejp9r5x5F68jA21nfXtwnA0G5NdAWEoNc0tCl27wVtNw3eyGrsghAWrKycVEotg/eyhUFT8YROLD6HoviE8p4gw0p7cW/a5FZc4wpGS196FwCwp3Er1DovEXn5RUFnzH5X07FJ0NOLnQtH7KTBS/Yv2Bq7VU5qUfHETSg5h3NxCeWP167Nq3Zv9nYYDuqUhkGt+I29MfUfxpYkg7GAYlRasa0kEwbspMFH08VaiEKc0GSq4ombWFyMotKS7bLHW7fmjFuLdeu4f4bBoO15fD2PG5VWokWSMUo4lk/Ti52yf0BkG8EDJ6w5WfGETiwpQlFcovsJ3aYNZ9xaV5/s7OC74Pk5vgt/AcWoVhvrGq+dNPhgL9ZWEusXdEEDJ0glFftGJBYXI75yovsJ3bo1N3/av9+9uf+JE8D27Vz6bdLx9UgYRrM1O2V5kdJ47aLB28mBI7KN4IUTAjdQ4YT+rDpQvTo6V/zAtm7N3zdtcg/c60u93CFm3G7H14FRrVY0Xvug92IdjjkJO13QBZsQjspJU/EowAHgbgns16/88exs/t65c3jGVorRbM1OWZ4Ei8AX63Ddldjpgi7YhHD1KjENj5J3AECdOry6iucE5bp1vKhwgwbhGx+Ma7Wi8TqLcM1J2GnSVrAJTpFKytAK3ED5BGVF1qwxRSYxglGtVjRe5xCuuxLpDS54YeVCCpagJZUArHPPmsVvhIj17c2bgWHDwj/GKECCRWDCKWHY5YIu2ARHrjmplXG3bs0ukpwcXvNwxgxeFPh27zUhBX1IsPCP3JUIESOqpBKAs+xatbi16eDBXFkpCBYgdyVCxHCcVFJU5FsqAXiCct8+Xon9n/8M79iiGKeX4ls1frkrESKC46SSwkLtjDslhb82bwZ+/ZUDeY8e4R9fFOL0hktOH78geBEVdkAXrVsDX3wBrF7N2bYVK5rHIHYrxQ8Wp49fELxwQpMpN3xJJQDr3AcPyqSkyTi9GMfp4xcELxwllZSU8Crm/jJuAPjTn0LqBii4E6rtLdL6uFQeClGHo6SSoiL+7itwZ2VxNn733eEbUwwQSuWeHTrbRUPlobR1FdxwlB3QFbh9SSUdO3KXQF+BXTCEP9tboGzaDs2qnG7bk8lVwQtH2QELC/m7v8AsQdsStGxvegKKXfRlJ9v27HDxE2yGExZSKCOQVCKEFT1uDWlWFTp2ufgJNsKRGrcvqUQIK3oCSjToy5FGLn6CF46yA+qRSoSwoSeg2KlVrVORi5/ghaPsgCKV2Aq9TZacrC/bAadPrgoWEFWuEguItAfZzkhACR9y8RPciDpXiYmIDSswElAEIQKIq8Q30uNCEARb4khXSZgCt9iwBEGwJVYGbiKaSUS5RLQx6FfXwiWVhEnjFhuWIAi2xGI74P8A9Av6lX0R5oxbbFiCINgSK+2ASqkfiKhZ0K/sizAHbnFNCIJgSxxlBwyzVAKIa0IQBBtiBzsgEQ0DMAwAmjRp4ntDKcCxFPGsC4JDsIMdUCk1QymVoZTKSElJ8b2hBG7LsEPfbEEQdOIoO2AEpJJYQTzrguAgrHSVENEcACsAtCKi/UT096CPUhHJuC1DPOuC4CAsdpUMCfpV/SGB2zJkXUZBcBAildiLSK0tKJ51QXAQjrIDRnnGHcmmVuJZFwQHYQc7oG58BG6jNja72d8ivbageNYFwSE4ciGFhPJDG81S7diyVSYIBUHQheM07sTE8kHDuI3NjvY3aWolCIIuHLXmZFGRl0xiNEu1Y3YrE4SCIOjCDpWTuikq8nKUGM1S7ZjdysK6giDowlGuEpdUUgG9C9Z6YnQ/q5EJQkEQAuI4V4lH4DZqYxP7myAIjsVxrhKN4hujWapkt4IgOBJHukoEQRBiGUcFbg2pRBAEIeZwnB0wivuUCIIg6MJRdkCRSgRBEEQqEQRBcBwilQiCIDgMR9kBCwuB6tXDfthA2K3LoCAIUY6jKidtKJXYscugIAhRjkgloWHHLoOCIEQ54ioJDTt2GRQEIcoRV0lo2LHLoCAIUY7jArfNpBLpoS0IQthxVHdAG0ol0mVQEISw4yg7oA2lEkC6DAqCEGZEKhEEQXAYjrID2lAqEQRBCDuOsgPaVCoRBEEIK46RSkpKgOJikUoEQRCslkqIqB8RbSOiHUQ0NuijuCgq4u+ScQuCEOtYKZUQUTyAVwD0B9AawBAiah30kQAJ3IIgCC4slkouBrBDKfWbUqoQwPsArgv6SIAEbkEQBBchBG5SAXYiopsA9FNK3Vn6++0Auiql7vbYbhiAYaW/tgWwMejROIO6AA5HehAWIu/P2cj7cy6tlFK6el7rKcAhjce8or1SagaAGQBARGuUUhl6BuA0ovm9AfL+nI68P+dCRGv0bqtHKtkPoHGF3xsBOBDsoARBEARz0BO4fwbQkoiaE1ElALcA+NzaYQmCIAi+CCiVKKXOEdHdABYCiAcwUym1KcBuM8wYnE2J5vcGyPtzOvL+nIvu9xZwclIQBEGwF+EveRcEQRBCQgK3IAiCw7AkcBPRU0T0KxGtJ6JviCjViuNECiJ6joi2lr7HT4koOdJjMhMiGkxEm4iohIiiwnplWtsGm0JEM4kol4iirn6CiBoT0RIi2lL6uRwZ6TGZCRFVIaLVRPRL6fsbH3AfKzRuIqqhlDpR+vO9AForpYabfqAIQURXAVhcOnH7LAAopcZEeFimQUQXASgB8DqAUUop3f5SO1LatuH/AFwJtrf+DGCIUmpzRAdmIkR0KYBTAN5RSrWN9HjMhIgaAmiolFpHRNUBrAUwKFr+f0REAKoqpU4RUSKAZQBGKqVW+trHkozbFbRLqQqNgh0no5T6Ril1rvTXlWBve9SglNqilNoW6XGYiHltG2yKUuoHAEcjPQ4rUEr9rpRaV/rzSQBbAETNclWKOVX6a2Lpl9+YaZnGTUQTiGgfgKEAHrPqODbgbwC+ivQgBL+kAdhX4ff9iKITP5YgomYAOgFYFdmRmAsRxRPRegC5AL5VSvl9f4YDNxEtIqKNGl/XAYBS6mGlVGMA7wK42/+r2Y9A7690m4cBnAO/R0eh5/1FEbraNgj2hoiqAfgEwH0ed/WORylVrJTqCL57v5iI/MpdhhcLVkr10bnpewAWAHjc6LEiQaD3R0R3ABgAoLdyoBk+iP9fNCBtGxxOqfb7CYB3lVJzIz0eq1BK5RHR9wD6wU+jPqtcJS0r/DoQwFYrjhMpiKgfgDEABiql8iM9HiEg0rbBwZRO3r0FYItS6sVIj8dsiCjF5UwjoiQAfRAgZlrlKvkEQCuwM2EPgOFKqRzTDxQhiGgHgMoAjpQ+tDLKXDPXA3gJQAqAPADrlVJ9Izuq0CCiqwFMRXnbhgkRHpKpENEcAJeD254eBPC4UuqtiA7KJIioJ4AfAWwAxxQA+LdS6svIjco8iKg9gLfBn804AB8qpZ70u48D7/IFQRBiGqmcFARBcBgSuAVBEByGBG5BEASHIYFbEATBYUjgFgRBcBgSuAVBEByGBG5BEASH8f/K3KVyq1qCsgAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x16e463bfef0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot_model(poly10_reg)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## LASSO"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.pipeline import Pipeline\n",
    "from sklearn.preprocessing import PolynomialFeatures\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "from sklearn.linear_model import Lasso\n",
    "\n",
    "def LassoRegression(degree, alpha):\n",
    "    return Pipeline([\n",
    "        ('poly', PolynomialFeatures(degree=degree)),\n",
    "        ('std_scaler', StandardScaler()),\n",
    "        ('lasso_reg', Lasso(alpha=alpha))\n",
    "    ])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1.1496080843259966"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "lasso1_reg = LassoRegression(20, 0.01)\n",
    "lasso1_reg.fit(X_train, y_train)\n",
    "\n",
    "y1_predict = lasso1_reg.predict(X_test)\n",
    "mean_squared_error(y_test, y1_predict)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x16e472e2588>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot_model(lasso1_reg)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1.1213911351818648"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "lasso2_reg = LassoRegression(20, 0.1)\n",
    "lasso2_reg.fit(X_train, y_train)\n",
    "\n",
    "y2_predict = lasso2_reg.predict(X_test)\n",
    "mean_squared_error(y_test, y2_predict)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x16e472e54e0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot_model(lasso2_reg)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 概念小结\n",
    "* Ridge L2正则(不具备特征选择,对于特征大的数据计算量大) -> MSE -> 欧拉距离\n",
    "* LASSO L1正则 -> MAE -> 曼哈顿距离\n",
    "* 明可夫斯基距离 -> Lp范数\n",
    "* L0正则\n",
    "* 弹性网 Elastic Net : $J(\\theta) = MSE(y, \\hat y;\\theta)+r\\alpha\\sum_{i=1}^{n}|\\theta_i|+\\frac{1-r}{2}\\alpha\\sum_{i=1}^{n}\\theta_i^2$\n",
    "\n",
    "弹性网结合了Ridge和LASSO的特点, 在Ridge计算开销大,同时还需要保证精度的时候, 可以考虑用弹性网"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
